<?php
/**
 * Controlador CRUD abstrato com autenticação e Simpla
 * @author Emanuel Melo e Renato Lenz @ PC4 Team
 * @package PC4_Controlador
 */
abstract class PC4_Controlador_APP_CRUD extends PC4_Controlador_SimplaAdmin {

	protected $modelo, $nomeSecao;
	protected $formView, $listaView, $editaView;
	protected $actionNovo, $actionEdita;
	
	public $dados;
		
	/**
	 * Inicializa os parâmetros do controlador
	 * @param object $modelo
	 * @param $formView
	 * @param $listaView
	 * @param $nomeSecao
	 */
	protected function init($modelo, $formView = '', $listaView = '', $editaView = '', $nomeSessao = 'usuarios', $urlLogin = 'admin/login/', $urlProibido = 'admin/main/proibido'){
		parent::init($nomeSessao, $urlLogin, $urlProibido);

		$this->modelo = $modelo;
		$this->nomeSecao = strtolower(get_class($this));
		$this->setView($formView, $listaView, $editaView);
		$this->actionNovo = site_url('admin/' . $this->nomeSecao . '/trataNovo');
		$this->actionEdita = site_url('admin/' . $this->nomeSecao . '/trataEdita/');

		$this->title .= ' | ' . ucfirst($this->nomeSecao);
		$this->dados["nome_secao"] = $this->nomeSecao;
		$this->dados["display_mensagens"] = "style='display: none;'";
		$this->dados["tab_lista"] = "default-tab";
		$this->dados['editar_novo'] = 'Novo';
		$this->dados['lista_busca'] = 'lista';
		$this->dados['action'] = $this->actionNovo;
		
		$this->controller_session = new Zend_Session_Namespace($this->router->class . "_session");
	}
	
	/**
	 * Metodo para setar views independente do init
	 */
	protected function setView($formView, $listaView = '', $editaView = ''){
		if (empty($formView)) {
			$formView = 'admin/' . $this->nomeSecao . '/form';
		}
		if (empty($listaView)) {
			$listaView = $formView;
		}
		if (empty($editaView)) {
			$editaView = $formView;
		}
		
		$this->listaView = $listaView;
		$this->formView = $formView;
		$this->editaView = $editaView;
	}
	
	/**
	 * Método automático para acessar a pagina principal
	 */
	function index() {
		$this->lista();
	}
	
	/**
	 * Gera um formulário para um novo registro
	 */
	function novo() {
		$this->dados["tab_lista"] = "";
		$this->dados["tab_form"] = "default-tab";
		$this->load->view($this->formView, $this->dados);
	}
	
	/**
	 * Gera um formulário para edição do registro
	 * @param int $id
	 */
	function edita($id, $campo = 'id', $debug = false) {
		$this->dados["tab_lista"]	= "";
		$this->dados["tab_form"]	= "default-tab";
		$this->dados['action']		= $this->actionEdita . '/'. $id;
		$this->dados["editar_novo"]	= "Editar";
		$this->dados["r"] = $this->modelo->ve($id, $campo);
		if ($this->editaView == $this->listaView) { 
			$this->lista();
		}
		else {
			$this->load->view($this->editaView, $this->dados);
		}
	}
	
	/**
	 * Gera uma lista de registro com paginação - padrão 20 registros por página
	 */
	function lista($pagina = 1, $limite = 20, $debug = false) {
		$this->dados["rs"] = $this->modelo->lista($pagina, $limite, $debug);
		$this->dados["total"] = $this->modelo->getTotalRegistros();
		$this->dados["limite"] = $limite;
		$this->dados["total_paginas"] = ceil($this->dados["total"] / $limite);
		$this->dados["pagina"] = $pagina;
		$this->load->view($this->listaView, $this->dados);
	}
	
	/**
	 * Cria um array de registro padrão preparado para ser inserido na base de dados
	 * @param array $post
	 * @return array com os campos
	 */
	protected function trataForm($id = 0) {
		$campos = array();
		foreach ($_POST as $chave => $valor) {
			$campos[$chave] = $this->input->post($chave);
		}
		return $campos;
	}
	
	/**
	 * Trata os campos do $_POST enviando para o modelo inserir na base de dados
	 */
	public function trataNovo() {
		$campos = $this->trataForm();
		$retorno = $this->modelo->insere($campos);
		$this->resultadoNovo($retorno, $campos);
	}
	
	/**
	 * Recebe o id do registro, trata-o e e em seguida manda o modelo
	 * executar a ação de edição
	 * @param int $id
	 */
	function trataEdita($id) {
		$campos = $this->trataForm($id);
		$erros = $this->modelo->edita($campos, $id);
		$this->resultadoEdita($erros, $campos);
	}
	
	/**
	 * Recebe o id do registro e manda o modelo executar a ação de exclusão
	 * @param int $id
	 */
	function trataApaga($id) {
		$this->modelo->apaga($id);
		$this->resultadoApaga(true);
	}
	
	/**
	 * Ativa e Desativa um registro
	 * @param int $modo
	 * @param int $id
	 * @return true - ativado, false - erro
	 */
	function ativaDesativa($modo, $id = null) {
		$modo = (empty($modo)) ? 0 : 1;
		if (empty($id)) {
			$ok = true;
			foreach ((array)$this->input->post("ativo") as $id) {
				$ok = $ok && $this->modelo->ativaDesativa($id, $modo);
			}
		}
		else {
			$ok = $this->modelo->ativaDesativa($id, $modo);
		}
		$this->resultadoAtivaDesativa($ok, $modo);
	}
	
	/**
	 * Apaga um ou mais registros seqüencialmente e manda mostrar o resultado na view
	 */
	function apagaVarios() {
		$registros = $this->input->post("ativo");
		foreach ((array)$registros as $id) {
			$this->modelo->apaga($id);
		}
		$this->resultadoApaga(!empty($registros));
	}
	
	/**
	 * Imprime para o usuário uma mensagem de sucesso ou erro
	 * na execução de um novo registro
	 * @param bool $resultado
	 */
	function resultado() {	
		$this->dados['mensagem'] = $this->controller_session->mensagem;
		$this->dados['css_mensagens'] = $this->controller_session->css_mensagens;
		$this->dados["display_mensagens"] = "style='display: block;'";
		$this->index();
	}
	
	/**
	 * Imprime para o usuário uma mensagem de sucesso ou erro
	 * na execução de um novo registro
	 * @param bool $resultado
	 */
	protected function resultadoNovo($resultado, $campos = array()) {
		if (is_numeric($resultado)) {
			$this->controller_session->mensagem = $this->lang->line("notification_sucesso_novo");
			$this->controller_session->css_mensagens = 'success';
		}
		else {
			$this->controller_session->mensagem = $this->lang->line("notification_erro") . implode("<br />", $resultado);
			$this->controller_session->css_mensagens = "error";
		}
		
		redirect('admin/' . $this->router->class . '/resultado');
	}
	
	/**
	 * Imprime para o usuário uma mensagem de sucesso ou erro
	 * na execução de edição de registro
	 * @param bool $resultado
	 */
	protected function resultadoEdita($resultado = array(), $campos = array()) {
		if (empty($resultado)) {
			$this->controller_session->mensagem = $this->lang->line("notification_sucesso_edita");
			$this->controller_session->css_mensagens = 'success';
		}
		else {
			$this->controller_session->mensagem = $this->lang->line("notification_erro") . implode("<br />", $resultado);
			$this->controller_session->css_mensagens = "error";
		}
		
		redirect('admin/' . $this->router->class . '/resultado');
	}
	
	/**
	 * Imprime para o usuário uma mensagem de sucesso ou erro
	 * na execução de exclusão de registro
	 * @param bool $resultado
	 */
	protected function resultadoApaga($resultado) {
		if ($resultado) {
			$this->controller_session->mensagem = $this->lang->line("notification_sucesso_apaga");
			$this->controller_session->css_mensagens = "success";
		}
		else {
			$this->controller_session->mensagem = $this->lang->line("notification_erro_apaga");
			$this->controller_session->css_mensagens = "error";
		}
		
		redirect('admin/' . $this->router->class . '/resultado');
		
	}
	
	/**
	 * Imprime para o usuário uma mensagem de sucesso ou erro
	 * na execução de Ativação/Desativação de registro
	 * @param bool $resultado
	 * @param int $modo
	 */
	protected function resultadoAtivaDesativa($resultado, $modo) {
		$legenda = array("desativado", "ativado");
		if ($resultado) {
			$this->controller_session->mensagem = $this->lang->line("notification_sucesso_{$legenda[$modo]}");
			$this->controller_session->css_mensagens = "success";
		}
		else {
			$this->controller_session->mensagem = $this->lang->line("notification_erro_{$legenda[$modo]}");
			$this->controller_session->css_mensagens = "error";
		}
		
		redirect('admin/' . $this->router->class . '/resultado');
	}
		
}